package cn.taskservice.redis.lock.util;

import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 解析分布式锁或者限流的key，
 * 例如@RedisLock(key = "'order:' + #orderId")或者@RedisLock(key = "'order:' + #order.id"),写死的时@RedisLock(key = "'order:'")
 *
 */
@Component
public class SpELParserUtil {

    private final SpelExpressionParser parser = new SpelExpressionParser();

    public String parse(String expression, Method method, Object[] args) {
        if (!expression.contains("#")) {
            return expression; // 非表达式，直接返回
        }
        Parameter[] parameters = method.getParameters();
        StandardEvaluationContext context = new StandardEvaluationContext();
        for (int i = 0; i < parameters.length; i++) {
            context.setVariable(parameters[i].getName(), args[i]);
        }
        return parser.parseExpression(expression).getValue(context, String.class);
    }
}
